#pragma once
#include<iostream>
#include<string>
#include<unistd.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>

#include"log.hpp"
Log lg;

const std::string pathname="/home/bqx/linux-learning/Test_11_12";
int proj_id=0x6645;
int Size=4096;

int Getkey()
{
    key_t key=ftok(pathname.c_str(),proj_id);
    if(key<0)
    {
        lg(Fatal,"ftok fail,strerr:%s,error code:%d",strerror(errno),errno);
        return 1;
    }
    lg(Info,"ftok create success!");
    return key;
}

int GetShmHelper(int falg)
{
    int key=Getkey();
    int id=shmget(key,Size,falg);
    if(id<0)
    {
        lg(Fatal,"shmget fail,strerr:%s,errno code:%d",strerror(errno),errno);
        return 1;
    }
    lg(Info,"shmget create success!");
    return id;
}

int CreateShm()
{
    return GetShmHelper(IPC_CREAT|IPC_EXCL|0666);
}

int GetShm()
{
    return GetShmHelper(IPC_CREAT|0666);
}

#define FIFO_FILE "./myfifo"
#define MODE 0664

enum
{
    MKFIFO_ERR=1,
    UNLINK_ERR
};
class Init
{
public:
    Init()
    {
        int n=mkfifo(FIFO_FILE,MODE);
        if(n<0)
        {
            lg(Fatal,"mkfifo fail,strerr:%s,error code:%d",strerror(errno),errno);
            exit(MKFIFO_ERR);
        }

    }

    ~Init()
    {
        int n=unlink(FIFO_FILE);
        if(n<0)
        {
            lg(Fatal,"unlink fail,strerr:%s,error code:%d",strerror(errno),errno);
            exit(UNLINK_ERR);
        }
    }

};

